<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>
    
    指向函数的指针变量和指针函数 - DSRBLOG
    
  </title>
  

  
  
  <link href="atom.xml" rel="alternate" title="DSRBLOG" type="application/atom+xml">
  <link rel="stylesheet" href="asset/css/style.min.css">
  <link rel="stylesheet" href="asset/css/doc.css">
  <script src="asset/app.js"></script>


</head>

<body> <section class="ct-body">
	<div class="container">
		<div class="columns is-variable bd-klmn-columns is-4 is-centered">
			<div class="column is-four-fifths">
				<div class="post-body single-content">
					
					<h1 class="title">
						指向函数的指针变量和指针函数
					</h1>


					<div class="media">
						
						
						<div class="media-content">
							<div class="content">
								<p>
									<span class="date">2022/01/19 21:25 下午</span>
									

									

									<br />
									<span class="tran-tags">Tags:</span>&nbsp;
									
									<a class="tag is-link is-light">#C语言</a>
									

								</p>
							</div>
						</div>

					</div>
				</div>
				<article class="markdown-body single-content">
					<h2><a id="%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88%EF%BC%88%E6%8C%87%E5%90%91%E5%87%BD%E6%95%B0%E7%9A%84%E6%8C%87%E9%92%88%EF%BC%89" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>函数指针（指向函数的指针）</h2>
<p><code>函数指针变量</code>常用的用途之一是把指针作为参数传递到其它函数。<code>函数指针</code>也可以作为参数，以实现函数的<code>地址传递</code>，这样就能够在被调用的函数中使用实参函数</p>
<h3><a id="%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88%E7%9A%84%E4%B8%80%E8%88%AC%E5%AE%9A%E4%B9%89%E5%BD%A2%E5%BC%8F" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>函数指针的一般定义形式</h3>
<pre class="line-numbers"><code class="language-c">返回类型 (*函数名)(参数列表)
int (*fun)(int, int);
</code></pre>
<ul>
<li><code>(*函数名)</code>指向对应函数的首地址</li>
</ul>
<h3><a id="%E4%BE%8B" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>例</h3>
<p>设一个函数process，在调用它的时候，每次实现不同的功能。输入a和b两个数，第一次调用process时求a、b中的最大值，第二次求最小值，第三次求和。</p>
<pre class="line-numbers"><code class="language-c">#include &lt;stdio.h&gt;

int main()
{
    int max(int, int); //函数声明，求最大值
    int min(int, int); //函数声明，求最小值

    //函数声明,int (*fun)(int,int)是一个指向函数的指针（指针函数）
    void process(int, int, int (*fun)(int, int)); 

    int a, b;
    printf(&quot;enter a and b : &quot;);
    scanf(&quot;%d %d&quot;, &amp;a, &amp;b);
    printf(&quot;max = &quot;);
    process(a, b, max);
    printf(&quot;min = &quot;);
    process(a, b, min);
    return 0;
}

void process(int x, int y, int (*fun)(int, int))
{
    int result;
    result = (*fun)(x, y);
    printf(&quot;%d\n&quot;, result);
}

int max(int x, int y)
{
    int z;
    if (x &gt; y)
        z = x;
    else
        z = y;
    return (z);
}

int min(int x, int y)
{
    int z;
    if (x &lt; y)
        z = x;
    else
        z = y;
    return (z);
}

</code></pre>
<h2><a id="%E6%8C%87%E9%92%88%E5%87%BD%E6%95%B0%EF%BC%88%E8%BF%94%E5%9B%9E%E6%8C%87%E9%92%88%E7%9A%84%E5%87%BD%E6%95%B0%EF%BC%89" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>指针函数（返回指针的函数）</h2>
<p>一个函数可以返回一个整数值、字符值、实型值等，也可以返回指针型的数据，即地址。</p>
<h3><a id="%E6%8C%87%E9%92%88%E5%87%BD%E6%95%B0%E7%9A%84%E4%B8%80%E8%88%AC%E5%AE%9A%E4%B9%89%E5%BD%A2%E5%BC%8F" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>指针函数的一般定义形式</h3>
<pre class="line-numbers"><code class="language-c">返回类型 *函数名(参数列表)
int *fun(int x, int y);
</code></pre>
<h3><a id="%E4%BE%8B" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>例</h3>
<p>以<code>strcpy()</code>函数和<code>strcat()</code>函数为例，二者都有返回值，并且返回值都是<code>char *</code>类型，所以二者都是返回指针的函数，即指针函数</p>
<h4><a id="strcpy" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>strcpy()</h4>
<pre class="line-numbers"><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

int main()
{
    char *p = &quot;Hello world!&quot;;
    char a[20];
    puts(strcpy(a, p)); // strcpy()函数返回了一个指针，指向数组a[]的地址
    return 0;
}
</code></pre>
<h4><a id="strcat" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>strcat()</h4>
<pre class="line-numbers"><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

int main()
{
    char *p = &quot;world!&quot;;
    char a[20] = &quot;Hello &quot;;
    puts(strcat(a, p)); // strcpy()函数返回了一个指针，指向数组a[]的地址
    return 0;
}
</code></pre>

				</article>
				<div class="comments-wrap">
					<div class="share-comments">
						

						

						
					</div>
				</div><!-- end comments wrap -->
			</div>
		</div><!-- end columns -->
	</div><!-- end container -->
</section>  














<script src="asset/prism.js"></script>









</body>

</html>